#ifndef IRCSOCKET_H
#define IRCSOCKET_H

/***************************************************************
	Класс для подключения к серверу и поддержания подключения.
	Авторы: ...
	Дата: 17.03.2010г
***************************************************************/

#include <QObject>
#include <QtNetwork/QTcpSocket>
//#include <QTcpSocket>

#include "IrcSocketType.h"

class IrcSocket : public QTcpSocket {
	Q_OBJECT

public:
	IrcSocket(QObject* parent = 0);
	~IrcSocket();

private:

	//хранилище данных
	SocketData socketdata;

	//последние оборванные данные
	QString tail;

	//флаг необходимости подключения после дисконнекта
	bool needconnect;
	
	//идентификатор таймера, отвечающего за ожидание данных от сервера
	int to_timer;
	//идентификатор таймера, отвечающего за подключение к серверу
	int co_timer;

public slots:
	/**
		Запрос параметров сокета
		 sd_ - структура с данными
	*/
	void GetSocketData(SocketData& sd);
	/**
		Установка параметров сокета
		 sd_ - структура с данными
	*/
	void SetSocketData(const SocketData& sd);
	/**
		Подключение к серверу
	*/
	void Connect(int& res);
	void Connect(bool& res);
	void Connect();
	/**
		Отключение от сервера
	*/
	void Disconnect(int& res);
	void Disconnect(bool& res);
	void Disconnect();

	/**
		Передача данных на сервер
		 data - данные
	*/
	void Send(const QString& data);

private slots:
	/**
		Обработка полученных данных
	*/
	void SocketReadyRead();
	/**
		Обработка разрыва с сервером
	*/
	void SocketDisconnect();
	/**
		Обработка ошибок соединения
	*/
	void SocketError();
	/**
		Обработка успешного подключения к серверу
	*/
	void SocketConnected();
	/**
		Обработка отключения от сервера
	*/
	void SocketDisconnected();

protected:
	/**
		Обработка срабатывания таймера ожидания данных от сервера 
	*/
	void timerEvent(QTimerEvent *event);

signals:
	//сигнал о получении данных
	void GetData(const QString& data);
	//сигнал отправки данных (попробуем разрешить изменять отправляемые данные)
	void SendData(QString& data);
	//сигнал успешного подключения
	void Connected();
	//сигнал отключения от сервера
	void Disconnected();
	//сигнал об ошибке подключения
	void Error();
};


#endif //IRCSOCKET_H
